package store.util;

import day0301.MyListIndexOutOfBoundsException;

import java.util.Arrays;

/**
 * 存元素的容器
 * 解决数组不能动态扩容的问题
 */
public class MyList {

    /**
     * 存元素的容器
     */
    private Object[] arr;

    /**
     * 元素的个数
     */
    private int size;

    public MyList(int size) {
        if (size < 0) {
            // 抛出异常
            throw new IllegalArgumentException("size 不能小于 0");
        }
        arr = new Object[size];
    }

    /**
     * 添加元素
     *
     * @param obj
     * @return true 表示添加成功
     */
    public boolean add(Object obj) {
        // 判断能否存的下
        if (size == arr.length) {
            // 扩大容器容量
            grow();
        }
        arr[size++] = obj;
        return true;
    }

    /**
     * 对容器进行扩容
     * 容量扩大 1 倍
     */
    private void grow() {
        int newLength = arr.length * 2;
        // 将原来数组中的元素复制到新数组
        arr = Arrays.copyOf(arr, newLength);
    }


    /**
     * 根据索引获取元素
     *
     * @param index 元素的下标
     * @return
     */
    public Object getElement(int index) throws MyListIndexOutOfBoundsException {
        if (index < 0 || index > size - 1) {
            // 抛异常. 换种方法
            throw new MyListIndexOutOfBoundsException("下标错误： " + index);
        }
        return arr[index];
    }


    /**
     * 容器中元素的数量
     *
     * @return
     */
    public int size() {
        return size;
    }

    public int search(Object obj) {
        for (int i = 0; i < size; i++) {
            if (arr[i].equals(obj)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 将容器中所有元素转换为字符串形式返回
     *
     * @return 元素的字符串
     */
    public String toString() {
        String result = "";
        for (int i = 0; i < size; i++) {
            result += arr[i].toString() + "\n";
        }
        return result;
    }

}
